# 使用之前请注意：这个脚本要正确运行需要一个数据文件，要把数据文件的绝对路径
# 写在 $dbfile 变量中（如果谁有更好的文件引用办法，请告诉我^_^）
# 数据文件是一个文本文件，每一行有这样的结构：
# -----------------------------------------------------
# 关键字	无目标动作	目标为别人动作	目标为自己动作
# -----------------------------------------------------
# 以上的各字段使用制表符分割。数据文件中如果要用到自己，用 self 代替，
# 如果用到动作目标，用 target 代替。例如：
# 咧了咧嘴，target还以为self在冲他乐呢。
# target突然间被人蒙住了双眼，睁眼一看，self站在她的面前，手里捧着好大一簇玫瑰！
# 其时明月在天，清风吹叶，树巅乌鸦呀啊而鸣，self再也忍耐不住，望着target的背影，泪珠夺眶而出。
use strict;
use vars qw($VERSION %IRSSI @CHANGELOG %INDEXES %ACTIONS_NOTARGET
            %ACTIONS_OTARGET %ACTIONS_STARGET $HELP $NICK $dbfile);
use Irssi;
$NICK='yournick';
$VERSION = '0.03';
%IRSSI = (
    authors     => 'yaoms',
    contact     => 'yms541@gmail.com',
    name        => '预定义的表情动作',
    description => '这个脚本可以让你用简短的命令向当前irc窗口发送丰富的 /me 动作',
    license     => '本脚本遵循所有 GPL, 另外请特别注意：不要在 irc.freenode.net '.
                   '的 #ubuntu-cn 频道频繁使用这个脚本！',
);
@CHANGELOG =(
'2008-11-06 更换了梦幻西游的动作列表，并添加了索引，方便查询。',
'        06 改善帮助和信息查询。',
'        08 将内置动作列表，改为外置，方便添加和修改，并写了一个初始化函数，'.
'用来在启动时加载这个动作列表。',
);
$HELP = "Usage: /myaction <action> [<nick>]\n".
				"       /myinfo [<list>[ <keyword>]|<change>]";
# 在这里设置你自己的 $dbfile 变量
$dbfile = "/home/yaoms/.irssi/scripts/actions.list";
sub init {
  open FH,$dbfile;
  my (@all) = <FH>;
  close FH;

  my ($index) = 0;
  foreach(@all) {
    chomp;
    my (@line) = split /\t/;
    if (3 == $#line) {
      $INDEXES{$line[0]} = $index;
      $ACTIONS_NOTARGET{$index} = $line[1];
      $ACTIONS_OTARGET{$index} = $line[2];
      $ACTIONS_STARGET{$index} = $line[3];
      $index++;
    }
  }
}

init;

sub getmsg {
  my ($ac,$nick) = @_;
  my ($msg);

  if ($nick) {
    if ($nick eq 'self') {
      $msg = $ACTIONS_STARGET{$INDEXES{$ac}};
    } else {
		  $msg = $ACTIONS_OTARGET{$INDEXES{$ac}};
      $msg =~ s/target/ $nick /g;
		}
  } else {
    $msg = $ACTIONS_NOTARGET{$INDEXES{$ac}};
  }
  $msg =~ s/self/ $NICK /g;
  return $msg;
}

# Usage: /myaction [<action_name>] [<nick>]
sub myaction {
  # data - contains the parameters for /HELLO
  # server - the active server in window
  # witem - the active window item (eg. channel, query)
  #         or undef if the window is empty
  my ($data, $server, $witem) = @_;

  if (!$server || !$server->{connected}) {
    Irssi::print("Not connected to server");
    return;
  }

	$NICK = $server->{nick} if not $NICK eq $server->{nick};

  return unless $witem;

  if ($data) {
    my ($ac,$nick) = split /\s+/,$data;
    my ($mesg);
    if ($INDEXES{$ac}) {
      if ($nick) {
        $mesg = getmsg($ac,$nick);
        $witem->command("me ". $mesg) if $mesg;
      } else {
        $mesg = getmsg($ac);
        $witem->command("me ". $mesg) if $mesg;
      }
    }
  } else {
    Irssi::print($HELP);
  }
}

sub myinfo {
	my ($data, $server, $witem) = @_;
	my ($action,$argv) = split /\s+/,$data;
	if ($action =~ m/list/i) {
  	Irssi::print("\cC4符合条件的动作：");
		foreach(keys %INDEXES) {
		  if (m/$argv/i) {
				Irssi::print($_);
			}
		}
	} elsif ($action =~ m/change/i) {
		foreach(@CHANGELOG) {
			Irssi::print("\cC0 ".$_);
		}
	} else {
		Irssi::print("\cC4Myaction Script v. ".$VERSION);
		Irssi::print("\cC3".$HELP);
		foreach my $key (sort keys %IRSSI) {
			Irssi::print("\cC4$key: \cC0 ".$IRSSI{$key});
		}
	}
}

Irssi::command_bind('myaction', 'myaction');
Irssi::command_bind('myinfo', 'myinfo');
